<?php

namespace app\api\middleware;

use app\api\model\UserToken;
use app\api\model\User;

class Auth
{

    /**
     * 中间件的入口执行方法必须是handle方法，而且第一个参数是Request对象，第二个参数是一个闭包
     * @param $request
     * @param \Closure $next
     * @return mixed|\think\response\Json
     */
    public function handle($request, \Closure $next)
    {
        // 获取请求头部的参数
        $header = $request->header();
        // 判断是否有token，没有则返回错误
        $token = isset($header['x-token']) ? $header['x-token'] : '';
        if (!$token) {
            return fail(INVALID_TOKEN, '请先登录');
        }
        // 判断token是否存在
        $tokenInfo = UserToken::queryTokenByTokenStr($token);
        if (!$tokenInfo) {
            return fail(INVALID_TOKEN, '登录失效');
        }
        // 判断token是否过期
        $ts = time();
        $tokenExpiredTime = $tokenInfo['expired_time'];
        // 增加半小时容差，以免出现极限的情况
        if ($ts >= $tokenExpiredTime + 1800) {
            // 删除当前用户的已失效的token
            UserToken::removeToken($tokenInfo['token_id']);
            return fail(EXPIRED_TOKEN, '登录已过期，请重新登录');
        }
        if(!$tokenInfo['user_id']){
            return fail(EXPIRED_TOKEN, '用户错误');
        }
        $userModel = new User();
        $user = $userModel->where('user_id',$tokenInfo['user_id'])->find();
        $request->XToken = $token;
        $request->userId = $tokenInfo['user_id'];
        $request->groupId = $user['group_id'];
        return $next($request);
    }

}